﻿//#include <iostream>
//#include <atomic>
//#include <thread>
//#include <vector>   
//
//using namespace std;
//
//int cnt;
//atomic<int> acnt;
//
//// load和store可以原子的读取和修改atomic封装存储的T对象
//void Add1(atomic<int>& cnt){
//	int old = cnt.load();
//	// 如果cnt的值跟old相等，则将cnt的值设置为old+1，并且返回true，这组操作是原⼦的。 
//	// 那么如果在load和compare_exchange_weak操作之间cnt对象被其他线程改了 
//	// 则old和cnt不相等，则将old的值改为cnt的值，并且返回false。 
//	while (!atomic_compare_exchange_weak(&cnt, &old, old + 1));
//	//while (!cnt.compare_exchange_weak(old, old + 1));
//}
//
//void f(){
//	for (int n = 0; n < 100000; ++n){
//		// ++acnt;
//		// Add1的⽤CAS模拟atomic的operator++的原⼦操作 
//		 Add1(acnt);
//		++cnt;
//	}
//}
//
//
//int main() {
//	std::vector<thread> pool;
//	for (int i = 0; i < 4; ++i) pool.emplace_back(f);
//	for (auto& e : pool) e.join();
//	cout << "原子计数器为 " << acnt << '\n'
//		<< "非原子计数器为 " << cnt << '\n';
//	return 0;
//}